package com.cskaoyan.javase.oop1._11static._3usecase;

import com.cskaoyan.javase.oop1._7game._1pvz.Test;

/**
 * static关键字有什么具体的使用场景呢？
 * 这里，根据static关键字的一些特点来明确它的使用场景，给大家以后使用static关键字做一下参考。
 *      1.使用静态成员变量,结合它的特点：
 *          a.全局唯一,并不会因为对象而产生不同
 *          b.被类全局共享,被全体对象共享
 *
 *      2.使用静态成员方法,结合它的特点:
 *          不用创建对象即可调用方法
 *          说明它的调用很方便
 *
 *          根据静态成员方法调用简单的特点，当一个类中全部都是静态成员方法时
 *          类中的所有方法的调用都可以使用类名点去完成，这就是Java当中的"工具类"。
 *          比较典型的,JDK源码中的工具类有：数组工具类Arrays、集合工具类Collections、数学工具类Math等等。
 *          对象工具类Objects
 *
 *
 * 补充:
 *      静态成员变量的赋值
 *      实际上可以依赖于两种方法:
 *          成员方法: 在new对象后,存在对象了才可以调用
 *          静态成员方法: 只需要类加载,就可以调用
 *
 *
 * @since 15:24
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            Student s = new Student();
            System.out.println("第" + (i + 1) + "次创建的学生对象,他的id是" + s.stuId);
        }
        // for (int i = 0; i < 3; i++) {
        //     Student s = new Student("张三");
        // }
        System.out.println(Student.count);

        System.out.println("-----------------------");

        Teacher.staticMethod();
        System.out.println(Teacher.var);

        Teacher t = new Teacher();
        t.method();
        System.out.println(Teacher.var);
    }
}

class Teacher {
    static int var = 1;

    public static void staticMethod() {
        var = 100;
    }

    public void method() {
        var = 200;
    }
}

class Student {
    String name;
    int stuId;
    static int count = 0;
    static int initId = 10001;

    /*
        需求2: 现在给每一个学生对象标记学号
            第一个学生对象的学号是10001
            第二个学生对象的学号是10002
            第三个学生对象的学号是10003
            ...
            依次加1
            这种场景如何实现呢?
            接下来要创建的对象的学号需要被存储起来
            这个存储下一个对象学号的变量应该是一个什么变量?
            这个变量肯定不能受创建对象影响,必须能够一直存储,所以肯定是一个静态成员变量

     */

    /*
        需求: Student有一个无参构造器,在外界可以创建它的对象
            现在要求统计在外界new创建对象的次数
            怎么办呢?
            既然要计数,就需要计数器,就是int count
            重点是int count是一个什么变量?
            由于要统计new对象的次数,显然该变量不应该受对象影响
            所以count一定是一个静态成员变量
     */
    public Student() {
        // 每new一个对象,构造器就执行一次,所以在构造器中计数器加1即可
        // 每new一个对象,构造器就执行一次,对象的id取值就加1
        /*stuId = initId;
        initId++;*/
        // 上述二合一
        stuId = initId++;
        count++;
    }

    // 类中的每一个构造器都是一种new对象的方式
    // public Student(String name) {
    //     this.name = name;
    //     count++;
    // }
}